class MarcacionesController < ApplicationController
  #MODULE: Horarios
  
  def show_descargar_ficha_marcacion #DESC: Descargar Ficha de Marcaciones.
    respond_to do |format|
      format.html {render :layout => false}
    end
  end

  def descargar_ficha_marcacion #IGNORE
    respond_to do |format|
      format.pdf  do
        fecha=Date.new(params[:date][:year].to_i,params[:date][:month].to_i)
        usuarios= params[:usuario_id].empty? ? Usuario.activos : Usuario.find(params[:usuario_id]).to_a
        marcaciones=Marcacion.generar_ficha_pdf(fecha,usuarios,current_user)
        send_data marcaciones,
          :filename => "Marcaciones - #{I18n.l(fecha,:format=>:full_month_name)} - #{fecha.year}.pdf",
          :type => "application/pdf"
      end
    end
  end
  
  def marcaciones_grupales #DESC: Permite agregar marcaciones manualmente a uno o mas usuarios.
    if request.method == :post
      return unless params[:cargo]
      @funcionarios=params[:cargo][:id].blank? ? Usuario.find_all_by_area_id(params[:area][:id]) : Usuario.find_all_by_cargo_id(params[:cargo][:id])
    end
  end
  
  #TODO Hacer la creacion de las marcaciones grupales con una sola sentencia sql.
  def create_marcacion_grupal #IGNORE
    unless params[:commit]=="Cancelar"
      flash_msg="No se han creado marcaciones, no se han seleccionado funcionarios."
      tipo=:error
      unless params[:usuarios_ids].blank?
        params[:usuarios_ids].each do |id|
          m=Marcacion.new(:usuario_id=>id,:hora => params[:hora],:fecha => params[:fecha],:tipo=>Marcacion::TGrupal,:responsable=>current_user)
          m.save
        end
        flash_msg='Marcaciones creadas correctamente.'
        tipo=:notice
      end
    end
    respond_to do |format|
      flash[tipo] =  flash_msg unless params[:commit]=="Cancelar"
      format.html {redirect_to(marcaciones_grupales_marcaciones_path)}
    end
  end

  def marcacion_manual #DESC: Permite la marcación desde el Bitacorh.
    @client_ip = request.remote_ip
  end

  def create_marcacion_manual #IGNORE
    usuario=Usuario.find_by_codigo(params[:codigo])
    fecha_hora=Time.now
    respond_to do |format|
      if usuario
        @marcacion=Marcacion.new(:fecha=>fecha_hora,
          :hora=>fecha_hora,:usuario_id=>usuario.id,:ip=>params[:ip],:tipo=>Marcacion::TManual,:responsable=>current_user)
        if @marcacion.save
          flash[:notice] =  'Marcacion realizada correctamente a las '+I18n.l(@marcacion.hora,:format => :time)
          redirect_to :action => "marcacion_manual"
          format.html { }
        else
          format.html { render :action => "marcacion_manual" }
          format.xml  { render :xml => @marcacion.errors, :status => :unprocessable_entity }
        end
      else
        flash[:error] =  'No se encontro un usuario con el codigo: '+params[:codigo]
        redirect_to :action => "marcacion_manual"
        format.html { }
      end
    end
  end
  
  def show_irregulares #DESC: Permite ver las marcaciones irregulares.
    #t1=Time.now
    @fecha,@irregulares = get_irregulares(params) if (params[:date])
    #t2=Time.now
  end

  def get_irregulares(params)
    fecha=Date.new(params[:date][:year].to_i,params[:date][:month].to_i,1)
    funcionarios=get_funcionarios(params)
    irregulares=[]
    t0=Time.now
    irregulares=Marcacion.irregulares(fecha, funcionarios)
    t1=Time.now
    logger.info "\n\n=============================================================="
    logger.info "Tiempo => #{t1-t0}"
    logger.info "==============================================================\n\n"
    [fecha,irregulares]
  end
  
  #    def get_irregulares(params)
  #      fecha=Date.new(params[:date][:year].to_i,params[:date][:month].to_i,1)
  #      funcionarios=get_funcionarios(params)
  #      irregulares=[]
  #      t0=Time.now
  #      fecha.beginning_of_month.upto(fecha.end_of_month) do |date|
  #        funcionarios.each do |funcionario|
  #          marcaciones=funcionario.marcaciones.por_fecha(date)
  #          unless marcaciones.blank?
  #            dm=DiaMarcacion.new(funcionario,date,marcaciones)
  #            irregulares<<dm if dm.irregular?(true)
  #          end
  #        end
  #      end
  #      t1=Time.now
  #      logger.info "\n\n+++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
  #      logger.info "Tiempo => #{t1-t0}"
  #      logger.info "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n"
  #      [fecha,irregulares]
  #    end

  #ajax, en marcaciones irregulares
  def agregar_marcacion #IGNORE
    fecha=Date.strptime(params[:fecha].to_s,'%d/%m/%Y')
    params[:hora]+=" hs" unless params[:hora].include?("hs")
    hora=DateTime.strptime(params[:hora],'%H:%M hs')
    usuario=Usuario.find_by_codigo(params[:codigo])
    if usuario
      m=Marcacion.new(:fecha=>fecha,
        :hora=>hora,
        :usuario_id=>usuario.id,
        :tipo=>Marcacion::TAgregada,
        :ip=>request.remote_ip,
        :responsable=>current_user)
      if m.save
        dm=DiaMarcacion.new(usuario,fecha)
        actualizar(params[:trId],dm,"Marcaci&oacute;n Agregada")
      end
    end
  end
  
  #ajax, en marcaciones irregulares
  def borrar_marcacion #IGNORE
    marcacion = Marcacion.find(params[:marcacionId])
    if marcacion
      fecha=marcacion.fecha
      usuario=marcacion.usuario
      marcacion.deleted_at=Time.now
      marcacion.responsable=current_user
      marcacion.save
      dm=DiaMarcacion.new(usuario,fecha)
      actualizar(params[:trId],dm,"Marcaci&oacute;n Borrada")
    end
  end

  private
  def actualizar(fila,dia_marcacion,accion)
    render :update do |page|
      page.replace_html fila, :partial => 'celdas',:locals => { :dia_marcacion => dia_marcacion,:index => "Ultima Modificacion:<br/>#{accion}"  }
      page.visual_effect :highlight, fila,:duration => 8.0
    end
  end

  def get_funcionarios(params)
    current_user.tiene_perfil?("Administrador") ? get_funcionarios_por_area(params) : current_user.subordinados
  end

  def get_funcionarios_por_area(params)
    if params[:cargo][:id].blank?
      Usuario.activos.find_all_by_area_id(params[:area][:id])
    else
      Usuario.activos.find_all_by_cargo_id(params[:cargo][:id])
    end
  end
end
